<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Tutorial: Transforming the eCommerce sample data | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="transforms.html" title="Transforming data">
<link rel="prev" href="transform-api-quickref.html" title="API quick reference">
<link rel="next" href="transform-examples.html" title="Transform examples">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="data-rollup-transform.html">Roll up or transform your data</a></span>
»
<span class="breadcrumb-link"><a href="transforms.html">Transforming data</a></span>
»
<span class="breadcrumb-node">Tutorial: Transforming the eCommerce sample data</span>
</div>
<div class="navheader">
<span class="prev">
<a href="transform-api-quickref.html">« API quick reference</a>
</span>
<span class="next">
<a href="transform-examples.html">Transform examples »</a>
</span>
</div>
<div class="section xpack">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="ecommerce-transforms"></a>Tutorial: Transforming the eCommerce sample data<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/transform/ecommerce-tutorial.asciidoc">edit</a><a class="xpack_tag" href="/subscriptions"></a>
</h2>
</div></div></div>
<p><a class="xref" href="transforms.html" title="Transforming data">Transforms</a> enable you to retrieve information
from an Elasticsearch index, transform it, and store it in another index. Let’s use the
<a href="/guide/en/kibana/7.7/add-sample-data.html" class="ulink" target="_top">Kibana sample data</a> to demonstrate how you can
pivot and summarize your data with transforms.</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
Verify that your environment is set up properly to use transforms. If the
Elasticsearch security features are enabled, to complete this tutorial you need a user
that has authority to preview and create transforms. You must also have
specific index privileges for the source and destination indices. See
<a class="xref" href="transform-setup.html" title="Set up transforms">Setup</a>.
</li>
<li class="listitem">
<p>Choose your <em>source index</em>.</p>
<p>In this example, we’ll use the eCommerce orders sample data. If you’re not
already familiar with the <code class="literal">kibana_sample_data_ecommerce</code> index, use the
<span class="strong strong"><strong>Revenue</strong></span> dashboard in Kibana to explore the data. Consider what insights you
might want to derive from this eCommerce data.</p>
</li>
<li class="listitem">
<p>Play with various options for grouping and aggregating the data.</p>
<p><em>Pivoting</em> your data involves using at least one field to group it and applying
at least one aggregation. You can preview what the transformed data will look
like, so go ahead and play with it!</p>
<p>For example, you might want to group the data by product ID and calculate the
total number of sales for each product and its average price. Alternatively, you
might want to look at the behavior of individual customers and calculate how
much each customer spent in total and how many different categories of products
they purchased. Or you might want to take the currencies or geographies into
consideration. What are the most interesting ways you can transform and
interpret this data?</p>
<p>Go to <span class="strong strong"><strong>Management</strong></span> &gt; <span class="strong strong"><strong>Elasticsearch</strong></span> &gt; <span class="strong strong"><strong>Transforms</strong></span> in Kibana and use the
wizard to create a transform:</p>
<div class="imageblock screenshot">
<div class="content">
<img src="images/ecommerce-pivot1.jpg" alt="Creating a simple transform in Kibana">
</div>
</div>
<p>In this case, we grouped the data by customer ID and calculated the sum of
products each customer purchased.</p>
<p>Let’s add some more aggregations to learn more about our customers' orders. For
example, let’s calculate the total sum of their purchases, the maximum number of
products that they purchased in a single order, and their total number of orders.
We’ll accomplish this by using the
<a class="xref" href="search-aggregations-metrics-sum-aggregation.html" title="Sum Aggregation"><code class="literal">sum</code> aggregation</a> on the
<code class="literal">taxless_total_price</code> field, the
<a class="xref" href="search-aggregations-metrics-max-aggregation.html" title="Max Aggregation"><code class="literal">max</code> aggregation</a> on the
<code class="literal">total_quantity</code> field, and the
<a class="xref" href="search-aggregations-metrics-cardinality-aggregation.html" title="Cardinality Aggregation"><code class="literal">cardinality</code> aggregation</a>
on the <code class="literal">order_id</code> field:</p>
<div class="imageblock screenshot">
<div class="content">
<img src="images/ecommerce-pivot2.jpg" alt="Adding multiple aggregations to a transform in Kibana">
</div>
</div>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>If you’re interested in a subset of the data, you can optionally include a
<a class="xref" href="search-search.html#request-body-search-query">query</a> element. In this
example, we’ve filtered the data so that we’re only looking at orders with a
<code class="literal">currency</code> of <code class="literal">EUR</code>. Alternatively, we could group the data by that field too.
If you want to use more complex queries, you can create your data frame from a
<a href="/guide/en/kibana/7.7/save-open-search.html" class="ulink" target="_top">saved search</a>.</p>
</div>
</div>
<p>If you prefer, you can use the
<a class="xref" href="preview-transform.html" title="Preview transform API">preview transforms API</a>.</p>
<details>
<summary class="title">API example</summary>
<div class="content">
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _transform/_preview
{
  "source": {
    "index": "kibana_sample_data_ecommerce",
    "query": {
      "bool": {
        "filter": {
          "term": {"currency": "EUR"}
        }
      }
    }
  },
  "pivot": {
    "group_by": {
      "customer_id": {
        "terms": {
          "field": "customer_id"
        }
      }
    },
    "aggregations": {
      "total_quantity.sum": {
        "sum": {
          "field": "total_quantity"
        }
      },
      "taxless_total_price.sum": {
        "sum": {
          "field": "taxless_total_price"
        }
      },
      "total_quantity.max": {
        "max": {
          "field": "total_quantity"
        }
      },
      "order_id.cardinality": {
        "cardinality": {
          "field": "order_id"
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1154.console"></div>
</div>
</details>
</li>
<li class="listitem">
<p>When you are satisfied with what you see in the preview, create the
transform.</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
Supply a job ID and the name of the target (or <em>destination</em>) index. If the
target index does not exist, it will be created automatically.
</li>
<li class="listitem">
Decide whether you want the transform to run once or continuously.
</li>
</ol>
</div>
<p>Since this sample data index is unchanging, let’s use the default behavior and
just run the transform once.</p>
<p>If you want to try it out, however, go ahead and click on <span class="strong strong"><strong>Continuous mode</strong></span>.
You must choose a field that the transform can use to check which
entities have changed. In general, it’s a good idea to use the ingest timestamp
field. In this example, however, you can use the <code class="literal">order_date</code> field.</p>
<p>If you prefer, you can use the
<a class="xref" href="put-transform.html" title="Create transform API">create transforms API</a>.</p>
<details>
<summary class="title">API example</summary>
<div class="content">
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT _transform/ecommerce-customer-transform
{
  "source": {
    "index": [
      "kibana_sample_data_ecommerce"
    ],
    "query": {
      "bool": {
        "filter": {
          "term": {
            "currency": "EUR"
          }
        }
      }
    }
  },
  "pivot": {
    "group_by": {
      "customer_id": {
        "terms": {
          "field": "customer_id"
        }
      }
    },
    "aggregations": {
      "total_quantity.sum": {
        "sum": {
          "field": "total_quantity"
        }
      },
      "taxless_total_price.sum": {
        "sum": {
          "field": "taxless_total_price"
        }
      },
      "total_quantity.max": {
        "max": {
          "field": "total_quantity"
        }
      },
      "order_id.cardinality": {
        "cardinality": {
          "field": "order_id"
        }
      }
    }
  },
  "dest": {
    "index": "ecommerce-customers"
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1155.console"></div>
</div>
</details>
</li>
<li class="listitem">
<p>Start the transform.</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>Even though resource utilization is automatically adjusted based on the
cluster load, a transform increases search and indexing load on your
cluster while it runs. If you’re experiencing an excessive load, however, you
can stop it.</p>
</div>
</div>
<p>You can start, stop, and manage transforms in Kibana:</p>
<div class="imageblock screenshot">
<div class="content">
<img src="images/manage-transforms.jpg" alt="Managing transforms in Kibana">
</div>
</div>
<p>Alternatively, you can use the
<a class="xref" href="start-transform.html" title="Start transform API">start transforms</a> and
<a class="xref" href="stop-transform.html" title="Stop transforms API">stop transforms</a> APIs.</p>
<details>
<summary class="title">API example</summary>
<div class="content">
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _transform/ecommerce-customer-transform/_start</pre>
</div>
<div class="console_widget" data-snippet="snippets/1156.console"></div>
</div>
</details>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>If you chose a batch transform, it is a single operation that has a
single checkpoint. You cannot restart it when it’s complete. Continuous transforms
differ in that they continually increment and process checkpoints as new source
data is ingested.</p>
</div>
</div>
</li>
<li class="listitem">
<p>Explore the data in your new index.</p>
<p>For example, use the <span class="strong strong"><strong>Discover</strong></span> application in Kibana:</p>
<div class="imageblock screenshot">
<div class="content">
<img src="images/ecommerce-results.jpg" alt="Exploring the new index in Kibana">
</div>
</div>
</li>
</ol>
</div>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>If you do not want to keep the transform, you can delete it in
Kibana or use the
<a class="xref" href="delete-transform.html" title="Delete transform API">delete transform API</a>. When
you delete a transform, its destination index and Kibana index
patterns remain.</p>
</div>
</div>
<p>Now that you’ve created a simple transform for Kibana sample data, consider
possible use cases for your own data. For more ideas, see
<a class="xref" href="transform-usage.html" title="When to use transforms">When to use transforms</a> and <a class="xref" href="transform-examples.html" title="Transform examples">Examples</a>.</p>
</div>
<div class="navfooter">
<span class="prev">
<a href="transform-api-quickref.html">« API quick reference</a>
</span>
<span class="next">
<a href="transform-examples.html">Transform examples »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
